// 身份验证中间件
import jwt from 'jsonwebtoken';
import { redisClient } from '../db/index.js';
import Admin from '../server/auth/AdminModel.js';

// JWT密钥
const JWT_SECRET = process.env.JWT_SECRET || 'your_jwt_secret_key';

/**
 * 通用身份验证中间件
 * 验证JWT令牌并将用户信息添加到请求对象
 */
export const authMiddleware = async (req, res, next) => {
  try {
    // 从请求头获取令牌
    const authHeader = req.headers.authorization;
    if (!authHeader) {
      return res.status(401).json({
        success: false,
        message: '未提供授权令牌'
      });
    }

    // 验证令牌格式
    const parts = authHeader.split(' ');
    if (parts.length !== 2 || parts[0] !== 'Bearer') {
      return res.status(401).json({
        success: false,
        message: '授权格式错误，请使用 Bearer token 格式'
      });
    }

    const token = parts[1];

    // 验证令牌
    const decoded = jwt.verify(token, JWT_SECRET);

    // 从Redis检查令牌是否有效（用于注销功能）
    const storedToken = await redisClient.get(`auth:${decoded.id}`);
    if (!storedToken || storedToken !== token) {
      return res.status(401).json({
        success: false,
        message: '令牌已失效，请重新登录'
      });
    }

    // 将管理员信息添加到请求对象
    req.admin = {
      id: decoded.id,
      username: decoded.username,
      role: decoded.role
    };

    next();
  } catch (error) {
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        message: '令牌已过期，请重新登录'
      });
    }

    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        message: '无效的令牌'
      });
    }

    console.error('身份验证错误:', error);
    return res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
};

/**
 * 超级管理员身份验证中间件
 * 验证用户是否具有超级管理员权限
 */
export const adminAuthMiddleware = async (req, res, next) => {
  try {
    // 首先确保用户已经通过了基本身份验证
    if (!req.admin || !req.admin.id) {
      return res.status(401).json({
        success: false,
        message: '需要身份验证'
      });
    }

    // 检查是否是超级管理员
    if (req.admin.role !== 'super') {
      return res.status(403).json({
        success: false,
        message: '权限不足，需要超级管理员权限'
      });
    }

    // 检查管理员账号是否存在且状态正常
    const admin = await Admin.findByPk(req.admin.id);
    if (!admin || admin.status !== 'active') {
      return res.status(403).json({
        success: false,
        message: '管理员账号不存在或已被禁用'
      });
    }

    next();
  } catch (error) {
    console.error('管理员身份验证错误:', error);
    return res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
}; 